#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════
# TruckerMaster Bridge — lanceur macOS (exécutable du .app)
# ───────────────────────────────────────────────────────────────────────────
# Au double-clic : installe le pont PC/SC (lecture de la carte conducteur) en
# tâche de fond et le configure pour démarrer TOUT SEUL à chaque ouverture de
# session (LaunchAgent). Le navigateur de l'app peut alors lire la carte via
# http://localhost:7777 sans aucune manip.
# Idempotent : on peut le relancer autant de fois qu'on veut.
# Messages utilisateur localisés dans les 23 langues UE (fallback anglais).
# ═══════════════════════════════════════════════════════════════════════════
set -u

LABEL="com.truckermaster.bridge"
PORT=7777
SUPPORT="$HOME/Library/Application Support/TruckerMaster"
BRIDGE_DST="$SUPPORT/pcsc-bridge"
LOG_DIR="$HOME/Library/Logs/TruckerMaster"
LOG="$LOG_DIR/bridge.log"
PLIST="$HOME/Library/LaunchAgents/$LABEL.plist"

# Sources embarquées dans le .app : Contents/MacOS/ -> Contents/Resources/pcsc-bridge
SELF="$(cd "$(dirname "$0")" && pwd)"
RES="$(cd "$SELF/../Resources" && pwd)"
BRIDGE_SRC="$RES/pcsc-bridge"

notify() { osascript -e "display notification \"$2\" with title \"TruckerMaster Bridge\" subtitle \"$1\"" >/dev/null 2>&1; }
alert()  { osascript -e "display dialog \"$1\" with title \"TruckerMaster Bridge\" buttons {\"OK\"} default button \"OK\" with icon note" >/dev/null 2>&1; }

mkdir -p "$SUPPORT" "$LOG_DIR" "$HOME/Library/LaunchAgents"

# ── i18n : langue de l'OS (2 lettres), fallback en ─────────────────────────
LOC="$(defaults read -g AppleLocale 2>/dev/null)"; [ -z "$LOC" ] && LOC="${LANG:-en}"
L="$(printf '%s' "$LOC" | cut -c1-2 | tr 'A-Z' 'a-z')"

# Défauts = anglais (référencent $PORT / $LOG)
S_ACTIVE="Active ✅"
S_STARTED="Bridge started (port $PORT) — it will restart automatically. You can read your card in the app."
S_NEEDNODE="Node.js is required but was not found on this Mac. Install it from nodejs.org (LTS version), then reopen TruckerMaster Bridge."
S_NORESP="The bridge was installed but is not responding on port $PORT yet. Log: $LOG"

case "$L" in
  fr) S_ACTIVE="Actif ✅"
      S_STARTED="Pont démarré (port $PORT) — il se relancera tout seul. Tu peux lire ta carte dans l'app."
      S_NEEDNODE="Node.js est requis et n'a pas été trouvé sur ce Mac. Installe-le depuis nodejs.org (version LTS), puis rouvre TruckerMaster Bridge."
      S_NORESP="Le pont a été installé mais ne répond pas encore sur le port $PORT. Journal : $LOG" ;;
  de) S_ACTIVE="Aktiv ✅"
      S_STARTED="Brücke gestartet (Port $PORT) — sie startet automatisch neu. Du kannst deine Karte in der App lesen."
      S_NEEDNODE="Node.js ist erforderlich und wurde auf diesem Mac nicht gefunden. Installiere es von nodejs.org (LTS-Version) und öffne TruckerMaster Bridge erneut."
      S_NORESP="Die Brücke wurde installiert, antwortet aber noch nicht auf Port $PORT. Protokoll: $LOG" ;;
  es) S_ACTIVE="Activo ✅"
      S_STARTED="Puente iniciado (puerto $PORT) — se reiniciará automáticamente. Puedes leer tu tarjeta en la app."
      S_NEEDNODE="Se requiere Node.js y no se encontró en este Mac. Instálalo desde nodejs.org (versión LTS) y vuelve a abrir TruckerMaster Bridge."
      S_NORESP="El puente se instaló pero aún no responde en el puerto $PORT. Registro: $LOG" ;;
  it) S_ACTIVE="Attivo ✅"
      S_STARTED="Ponte avviato (porta $PORT) — si riavvierà automaticamente. Puoi leggere la tua carta nell'app."
      S_NEEDNODE="Node.js è necessario e non è stato trovato su questo Mac. Installalo da nodejs.org (versione LTS), poi riapri TruckerMaster Bridge."
      S_NORESP="Il ponte è stato installato ma non risponde ancora sulla porta $PORT. Registro: $LOG" ;;
  pt) S_ACTIVE="Ativo ✅"
      S_STARTED="Ponte iniciada (porta $PORT) — irá reiniciar automaticamente. Podes ler o teu cartão na app."
      S_NEEDNODE="O Node.js é necessário e não foi encontrado neste Mac. Instala-o em nodejs.org (versão LTS) e reabre o TruckerMaster Bridge."
      S_NORESP="A ponte foi instalada mas ainda não responde na porta $PORT. Registo: $LOG" ;;
  nl) S_ACTIVE="Actief ✅"
      S_STARTED="Brug gestart (poort $PORT) — start automatisch opnieuw. Je kunt je kaart in de app lezen."
      S_NEEDNODE="Node.js is vereist en is niet gevonden op deze Mac. Installeer het via nodejs.org (LTS-versie) en open TruckerMaster Bridge opnieuw."
      S_NORESP="De brug is geïnstalleerd maar reageert nog niet op poort $PORT. Logboek: $LOG" ;;
  pl) S_ACTIVE="Aktywny ✅"
      S_STARTED="Most uruchomiony (port $PORT) — uruchomi się ponownie automatycznie. Możesz odczytać kartę w aplikacji."
      S_NEEDNODE="Node.js jest wymagany i nie został znaleziony na tym Macu. Zainstaluj go z nodejs.org (wersja LTS), a następnie ponownie otwórz TruckerMaster Bridge."
      S_NORESP="Most został zainstalowany, ale jeszcze nie odpowiada na porcie $PORT. Dziennik: $LOG" ;;
  ro) S_ACTIVE="Activ ✅"
      S_STARTED="Punte pornită (port $PORT) — va reporni automat. Poți citi cardul în aplicație."
      S_NEEDNODE="Node.js este necesar și nu a fost găsit pe acest Mac. Instalează-l de pe nodejs.org (versiunea LTS), apoi redeschide TruckerMaster Bridge."
      S_NORESP="Puntea a fost instalată dar nu răspunde încă pe portul $PORT. Jurnal: $LOG" ;;
  bg) S_ACTIVE="Активен ✅"
      S_STARTED="Мостът е стартиран (порт $PORT) — ще се рестартира автоматично. Можете да прочетете картата си в приложението."
      S_NEEDNODE="Необходим е Node.js и не е намерен на този Mac. Инсталирайте го от nodejs.org (LTS версия) и отворете отново TruckerMaster Bridge."
      S_NORESP="Мостът е инсталиран, но все още не отговаря на порт $PORT. Журнал: $LOG" ;;
  cs) S_ACTIVE="Aktivní ✅"
      S_STARTED="Most spuštěn (port $PORT) — automaticky se restartuje. Kartu můžete načíst v aplikaci."
      S_NEEDNODE="Node.js je vyžadován a nebyl na tomto Macu nalezen. Nainstalujte jej z nodejs.org (verze LTS) a znovu otevřete TruckerMaster Bridge."
      S_NORESP="Most byl nainstalován, ale na portu $PORT zatím neodpovídá. Protokol: $LOG" ;;
  da) S_ACTIVE="Aktiv ✅"
      S_STARTED="Bro startet (port $PORT) — genstarter automatisk. Du kan læse dit kort i appen."
      S_NEEDNODE="Node.js er påkrævet og blev ikke fundet på denne Mac. Installer det fra nodejs.org (LTS-version), og åbn derefter TruckerMaster Bridge igen."
      S_NORESP="Broen blev installeret, men svarer endnu ikke på port $PORT. Log: $LOG" ;;
  el) S_ACTIVE="Ενεργό ✅"
      S_STARTED="Η γέφυρα ξεκίνησε (θύρα $PORT) — θα επανεκκινήσει αυτόματα. Μπορείτε να διαβάσετε την κάρτα σας στην εφαρμογή."
      S_NEEDNODE="Απαιτείται το Node.js και δεν βρέθηκε σε αυτόν τον Mac. Εγκαταστήστε το από το nodejs.org (έκδοση LTS) και ανοίξτε ξανά το TruckerMaster Bridge."
      S_NORESP="Η γέφυρα εγκαταστάθηκε αλλά δεν αποκρίνεται ακόμη στη θύρα $PORT. Αρχείο καταγραφής: $LOG" ;;
  et) S_ACTIVE="Aktiivne ✅"
      S_STARTED="Sild käivitatud (port $PORT) — taaskäivitub automaatselt. Saate oma kaarti rakenduses lugeda."
      S_NEEDNODE="Node.js on vajalik ja seda ei leitud sellest Macist. Paigaldage see aadressilt nodejs.org (LTS versioon) ja avage TruckerMaster Bridge uuesti."
      S_NORESP="Sild paigaldati, kuid ei vasta veel pordil $PORT. Logi: $LOG" ;;
  fi) S_ACTIVE="Aktiivinen ✅"
      S_STARTED="Silta käynnistetty (portti $PORT) — käynnistyy uudelleen automaattisesti. Voit lukea korttisi sovelluksessa."
      S_NEEDNODE="Node.js vaaditaan, eikä sitä löytynyt tästä Macista. Asenna se osoitteesta nodejs.org (LTS-versio) ja avaa TruckerMaster Bridge uudelleen."
      S_NORESP="Silta asennettiin, mutta se ei vastaa vielä portissa $PORT. Loki: $LOG" ;;
  hr) S_ACTIVE="Aktivno ✅"
      S_STARTED="Most pokrenut (priključak $PORT) — automatski će se ponovno pokrenuti. Karticu možete očitati u aplikaciji."
      S_NEEDNODE="Node.js je potreban i nije pronađen na ovom Macu. Instalirajte ga s nodejs.org (LTS verzija), zatim ponovno otvorite TruckerMaster Bridge."
      S_NORESP="Most je instaliran, ali još ne odgovara na priključku $PORT. Zapisnik: $LOG" ;;
  hu) S_ACTIVE="Aktív ✅"
      S_STARTED="Híd elindítva ($PORT port) — automatikusan újraindul. A kártyát az alkalmazásban olvashatja."
      S_NEEDNODE="A Node.js szükséges, és nem található ezen a Macen. Telepítse a nodejs.org oldalról (LTS verzió), majd nyissa meg újra a TruckerMaster Bridge-t."
      S_NORESP="A híd telepítve lett, de még nem válaszol a(z) $PORT porton. Napló: $LOG" ;;
  lt) S_ACTIVE="Aktyvus ✅"
      S_STARTED="Tiltas paleistas (prievadas $PORT) — bus automatiškai paleistas iš naujo. Kortelę galite nuskaityti programėlėje."
      S_NEEDNODE="Reikalingas Node.js ir jis nerastas šiame Mac. Įdiekite jį iš nodejs.org (LTS versija), tada vėl atidarykite TruckerMaster Bridge."
      S_NORESP="Tiltas įdiegtas, bet kol kas neatsako prievade $PORT. Žurnalas: $LOG" ;;
  lv) S_ACTIVE="Aktīvs ✅"
      S_STARTED="Tilts palaists (ports $PORT) — tas tiks automātiski restartēts. Karti varat nolasīt lietotnē."
      S_NEEDNODE="Ir nepieciešams Node.js, un tas šajā Mac netika atrasts. Instalējiet to no nodejs.org (LTS versija) un atkārtoti atveriet TruckerMaster Bridge."
      S_NORESP="Tilts tika instalēts, bet vēl neatbild uz portu $PORT. Žurnāls: $LOG" ;;
  mt) S_ACTIVE="Attiv ✅"
      S_STARTED="Pont mibdi (port $PORT) — jerġa' jibda awtomatikament. Tista' taqra l-karta tiegħek fl-app."
      S_NEEDNODE="Node.js huwa meħtieġ u ma nstabx fuq dan il-Mac. Installah minn nodejs.org (verżjoni LTS), imbagħad erġa' iftaħ TruckerMaster Bridge."
      S_NORESP="Il-pont ġie installat iżda għadu ma jweġibx fuq il-port $PORT. Reġistru: $LOG" ;;
  sk) S_ACTIVE="Aktívne ✅"
      S_STARTED="Most spustený (port $PORT) — automaticky sa reštartuje. Kartu si môžete načítať v aplikácii."
      S_NEEDNODE="Node.js je potrebný a nebol na tomto Macu nájdený. Nainštalujte ho z nodejs.org (verzia LTS) a znova otvorte TruckerMaster Bridge."
      S_NORESP="Most bol nainštalovaný, ale na porte $PORT zatiaľ neodpovedá. Protokol: $LOG" ;;
  sl) S_ACTIVE="Aktivno ✅"
      S_STARTED="Most zagnan (vrata $PORT) — samodejno se bo znova zagnal. Kartico lahko preberete v aplikaciji."
      S_NEEDNODE="Node.js je potreben in ni bil najden na tem Macu. Namestite ga s spletnega mesta nodejs.org (različica LTS), nato znova odprite TruckerMaster Bridge."
      S_NORESP="Most je nameščen, vendar se na vratih $PORT še ne odziva. Dnevnik: $LOG" ;;
  sv) S_ACTIVE="Aktiv ✅"
      S_STARTED="Brygga startad (port $PORT) — startar om automatiskt. Du kan läsa ditt kort i appen."
      S_NEEDNODE="Node.js krävs och hittades inte på den här Macen. Installera det från nodejs.org (LTS-version) och öppna sedan TruckerMaster Bridge igen."
      S_NORESP="Bryggan installerades men svarar inte på port $PORT ännu. Logg: $LOG" ;;
  *) : ;; # en (déjà défini)
esac

# 1) Trouver Node (bundle éventuel > Homebrew > /usr/local > PATH).
# On vérifie qu'il S'EXÉCUTE (--version) : un binaire de la mauvaise
# architecture (ex. arm64 sur un Mac Intel) est présent mais inutilisable.
NODE=""
for c in "$RES/node/bin/node" /opt/homebrew/bin/node /usr/local/bin/node "$(command -v node 2>/dev/null)"; do
  if [ -n "$c" ] && [ -x "$c" ] && "$c" --version >/dev/null 2>&1; then NODE="$c"; break; fi
done
if [ -z "$NODE" ]; then
  alert "$S_NEEDNODE"
  open "https://nodejs.org/download" 2>/dev/null
  exit 1
fi

# 1bis) Si on utilise le Node embarqué dans le .app, on le copie hors du .app
# (comme le runtime du pont) : le LaunchAgent doit survivre si l'utilisateur
# déplace ou supprime l'application après installation.
if [ "$NODE" = "$RES/node/bin/node" ]; then
  mkdir -p "$SUPPORT/node/bin"
  cp -f "$RES/node/bin/node" "$SUPPORT/node/bin/node"
  chmod +x "$SUPPORT/node/bin/node"
  [ -f "$RES/node/LICENSE" ] && cp -f "$RES/node/LICENSE" "$SUPPORT/node/LICENSE"
  NODE="$SUPPORT/node/bin/node"
fi

# 2) Copier/mettre à jour le runtime hors du .app (survit si l'app est déplacée/supprimée)
mkdir -p "$BRIDGE_DST"
if command -v rsync >/dev/null 2>&1; then
  rsync -a --delete "$BRIDGE_SRC/" "$BRIDGE_DST/"
else
  rm -rf "$BRIDGE_DST"/*; cp -R "$BRIDGE_SRC/." "$BRIDGE_DST/"
fi

# 3) Écrire le LaunchAgent (chemin Node absolu = robuste hors shell)
cat > "$PLIST" <<PLISTEOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>$LABEL</string>
  <key>ProgramArguments</key>
  <array>
    <string>$NODE</string>
    <string>$BRIDGE_DST/run.js</string>
  </array>
  <key>WorkingDirectory</key><string>$BRIDGE_DST</string>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>ThrottleInterval</key><integer>10</integer>
  <key>ProcessType</key><string>Background</string>
  <key>StandardOutPath</key><string>$LOG</string>
  <key>StandardErrorPath</key><string>$LOG</string>
</dict>
</plist>
PLISTEOF

# 4) (Re)charger l'agent — API launchctl moderne, fallback sur l'ancienne.
# ⚠ bootout est ASYNCHRONE : enchaîner bootstrap immédiatement échoue (erreur 5)
# si l'ancien service n'a pas fini de se décharger → on attend sa disparition,
# et on retente le bootstrap une fois si besoin.
U=$(id -u)
launchctl bootout "gui/$U/$LABEL" 2>/dev/null
for _ in $(seq 1 10); do
  launchctl print "gui/$U/$LABEL" >/dev/null 2>&1 || break
  /bin/sleep 0.5
done
launchctl bootstrap "gui/$U" "$PLIST" 2>/dev/null \
  || { /bin/sleep 1; launchctl bootstrap "gui/$U" "$PLIST" 2>/dev/null; } \
  || launchctl load "$PLIST" 2>/dev/null
launchctl enable "gui/$U/$LABEL" 2>/dev/null
launchctl kickstart -k "gui/$U/$LABEL" 2>/dev/null

# 5) Vérifier que le pont répond
OK=""
for _ in $(seq 1 20); do
  if [ "$(curl -s "http://localhost:$PORT/ping" 2>/dev/null)" = "pong" ]; then OK=1; break; fi
  /bin/sleep 0.5
done

if [ -n "$OK" ]; then
  notify "$S_ACTIVE" "$S_STARTED"
else
  alert "$S_NORESP"
fi
